রিলেশনাল ডেটাবেজ-এ ডেটাকে এক বা একাধিক টেবিলে সংরক্ষণ ও প্রকাশ করা হয়। কিছু কিছু টেবিলের মধ্যে অনেক সময় সম্পর্ক ( relation) থাকতে পারে। যেমন— ধরা যাক, একটি স্কুলের ডেটাবেজে ওই স্কুলের শিক্ষক ও শিক্ষার্থীর নানান ধরনের তথ্য থাকতে পারে। আবার পরীক্ষার ফলাফল, ক্লাসের রুটিন, এসব তথ্যও ডেটাবেজে থাকতে পারে। একই ধরনের সব তথ্য একটি টেবিলে থাকবে। যেমন শিক্ষকদের তথ্যের জন্য teacher টেবিল, শিক্ষার্থীদের তথ্যের জন্য student টেবিল, পরীক্ষার ফলাফল রাখার জন্য result টেবিল তৈরি করতে হবে। student টেবিল ও result টেবিলের মধ্যে একটি সম্পর্ক থাকবে, যেন দুটো টেবিল থেকে একজন শিক্ষার্থীর ব্যক্তিগত তথ্য ও পরীক্ষার ফলাফল সংক্রান্ত তথ্য একসঙ্গে পাওয়া যায়। আর এসব টেবিল মিলে তৈরি হবে school ডেটাবেজ।
একটি ডেটাবেজ টেবিলের দুটি অংশ থাকে, টেবিল হেডার (table header) ও টেবিল বডি (table body)। টেবিল হেডারে থাকে বিভিন্ন কলামের নাম এবং সেই কলামে কী ধরনের ডেটা রাখা হবে তার তথ্য। আর টেবিলের বডিতে থাকে মূল তথ্য। প্রতিটি সারি (row)-তে একটি নির্দিষ্ট বিষয়ের তথ্য থাকে। একটি টেবিলে কী কী ডেটা রাখা হবে এবং সেগুলো কী ধরনের হবে, সেটি আগে ঠিক করতে হয়। যেমন—
শিক্ষার্থীর টেবিলে থাকতে পারে শিক্ষার্থীর নাম, রোল নম্বর, ক্লাস, বিভাগ/শাখা, অভিভাবকের নাম, অভিভাবকের ফোন নম্বর, বাসার ঠিকানা ইত্যাদি।
ডেটার ধরন বিভিন্ন রকমের হতে পারে। সি প্রোগ্রামিং ভাষায় যেমন নির্দিষ্ট কিছু ডেটা টাইপ রয়েছে, রিলেশনাল ডেটাবেজেও তেমনি কিছু ডেটা টাইপ রয়েছে। বিভিন্ন ডেটাবেজ নির্মাতারা নিজেদের মতো ডেটা টাইপ নির্দিষ্ট করে দেন, তবে বেশ কিছু ডেটা টাইপ সব ডেটাবেজেই পাওয়া যাবে। যেমন— টেক্সট (text), পূর্ণসংখ্যা (integer), দশমিকযুক্ত সংখ্যা (decimal number), তারিখ (date) ইত্যাদি।
এখন আমরা একটি টেবিলের উদাহরণ দেখি :
এই শিক্ষার্থী টেবিলের প্রথম সারিটি হচ্ছে টেবিলের হেডার। এই সারিতে যেসব ঘর আছে, প্রতিটি হচ্ছে একটি কলাম (column)-এর নাম এবং তার ডেটা টাইপ (মানে ওই কলামে কী ধরনের ডেটা থাকবে)। যেমন- শিক্ষার্থীর নাম হচ্ছে একটি কলামের নাম এবং সেখানে টেক্সট টাইপের ডেটা থাকবে। এর নিচে যত ঘর থাকবে, সব ঘরে বিভিন্ন শিক্ষার্থীর নাম থাকবে, অন্য কোনো তথ্য থাকতে পারবে না। আর দ্বিতীয় সারি থেকে প্রতিটি সারিতে একজন করে শিক্ষার্থীর তথ্য দেওয়া আছে। যেমন— দ্বিতীয় সারির প্রথম ঘরে আছে মিজানুর রহমান, যা একজন শিক্ষার্থীর নাম, তারপরের ঘরে আছে তার রোল নম্বর, তারপরের ঘরে আছে তার শ্রেণি, অর্থাৎ সে কোন শ্রেণিতে পড়ছে, ইত্যাদি। একটি সারিতে কেবল একজন শিক্ষার্থীর তথ্য থাকবে, কখনো একাধিক শিক্ষার্থীর তথ্য থাকবে না ।
প্রতিটি সারিকে ইংরেজিতে বলে রো (row)। এগুলোকে রেকর্ড (record)-ও বলা হয়ে থাকে। আর টেবিলের প্রতিটি ঘর হচ্ছে একেকটি ফিল্ড (field)। বর্তমানে বিশ্বব্যাপী জনপ্রিয় ও বহুল ব্যবহৃত রিলেশনাল ডেটাবেজ হচ্ছে ওরাকল (Oracle), মাইএসকিউএল (MySQL), মাইক্রোসফট এসকিউএল সার্ভার (Microsoft SQL Server), পোস্টগ্রেস (PostgreSQL), মাইক্রোসফট অ্যাকসেস (Microsoft Access) ও এসকিউলাইট (SQLite)। এগুলোর মধ্যে মাইসিক্যুয়েল, পোস্টগ্রেস ও এসকিউলাইট হচ্ছে ফ্রি এবং ওপেন-সোর্স (free & open source) ডেটাবেজ। অর্থাৎ এগুলো ব্যবহার করার জন্য টাকা দিতে হয় না, এবং এগুলোর সোর্সকোডও উন্মুক্ত।
নোট: উচ্চারণের সুবিধার জন্য এসকিউএল শব্দটি অনেকে সিক্যুয়েল বলে উচ্চারণ করে। SQL শব্দটির পূর্ণরূপ, স্ট্রাকচারড কুয়েরি ল্যাঙ্গুয়েজ (Structured Query Language)
অনেক সময় ডেটাবেজ টেবিলে কিছু কিছু রেকর্ডে কোনো কলামের মান যদি অজানা থাকে, তখন সেখানে Null (বা NULL) ব্যবহার করা হয়। যেমন— student টেবিলে ফোন নম্বর বলে একটি কলাম আছে। এখন সবার যে ফোন নম্বর থাকতেই হবে, এমন কোনো কথা নেই, যেমন— মানিক মিয়া নামক শিক্ষার্থীর ফোন নম্বর নেই, তাই তার রেকর্ডে ফোন নম্বর ফিল্ডটি ফাঁকা রয়েছে। ডেটাবেজ ধরে নেবে এর মান নাল (NULL) । আবার, ধরা যাক ওই টেবিলে মাসিক পারিবারিক আয় নামে আরেকটি কলাম আছে। মাসিক পারিবারিক আয় একটি সংখ্যা। এখন, কেউ যদি তার মাসিক পারিবারিক আয় প্রকাশ করতে না চায় তো, সেখানে কিন্তু 0 বসবে না, বরং সেটি হবে ফাঁকা বা NULLI কারণ এক্ষেত্রে 0 মানে তার পরিবারের কারো কোনো আয় নেই। আবার অনেক সময় একটি টেবিলে বিভিন্ন মানুষের পেশা যদি রাখার প্রয়োজন হয়, সেখানেও সবার যে পেশা থাকতেই হবে, এমন কোনো কথা নেই। যেমন— ওই টেবিলে যদি তিন বছর বয়সি একটি শিশুর তথ্য থাকে, তাহলে তার পেশা হবে NULL, কারণ তাকে শিক্ষার্থী, চাকুরিজীবী, ব্যবসায়ী কিংবা বেকার—কোনো পেশাতেই ফেলা যাবে না। এখন পেশা যদি টেক্সট টাইপের হয়, তখন কিন্তু ফাঁকা স্ট্রিং (অর্থাৎ ") বসানো যাবে না, বরং ঘরটি ফাঁকা রাখতে হবে। ফাঁকা ঘরটিকে ডেটাবেজ NULL বলে বিবেচনা করবে।
প্রাইমারি কি হচ্ছে একটি টেবিলের নির্দিষ্ট কলাম, যেটি দিয়ে প্রতিটি রেকর্ডকে আলাদাভাবে চিহ্নিত করা যায়। শিক্ষার্থী টেবিলে কোন কলাম দিয়ে প্রতিটি শিক্ষার্থীকে আলাদাভাবে চিহ্নিত করা যায়? নাম দিয়ে করা যাবে না, কারণ একই শ্রেণিতে কিংবা আলাদা শ্রেণিতে একই নামে একাধিক শিক্ষার্থী থাকতে পারে। টেবিলে আমরা দেখতে পাচ্ছি, ‘মিজানুর রহমান' নামটি চতুর্থ শ্রেণির একজন শিক্ষার্থীর। কিন্তু ষষ্ঠ শ্রেণিতেও একজন মিজানুর রহমান থাকতে পারে। আবার আমরা যদি বলি, চতুর্থ শ্রেণির মিজানুর রহমান, তখন চতুর্থ শ্রেণিতে যদি একাধিক মিজানুর রহমান থাকে, তাহলে তাকে আলাদাভাবে চিহ্নিত করা যাবে না। তাই নাম প্রাইমারি কি (key) হতে পারবে না। রোল নম্বরও প্রাইমারি কি হতে পারে না, কারণ প্রতিটি শ্রেণিতেই রোল 1, 2, 3 ইত্যাদি রয়েছে। ফোন নম্বরও প্রাইমারি কি হতে পারবে না, কারণ সবার ফোন নম্বর নাও থাকতে পারে। তাহলে উপরে যে শিক্ষার্থী টেবিল তৈরি করা হয়েছে, সেখানে কোনো প্রাইমারি কি নেই। তবে, শ্রেণি, শাখা ও রোল নম্বর— এই তিনটি কলাম মিলে একটি প্রাইমারি কি হতে পারে, কারণ এই তিনটি তথ্য একসঙ্গে করলে আমরা প্রতিটি শিক্ষার্থীকে আলাদা করতে পারি। যখন একাধিক কলাম মিলে প্রাইমারি কি তৈরি হয়, তখন তাকে বলা হয় কম্পোজিট কি (composite key) ।
ডেটাবেজে টেবিল তৈরির সময় কোন কলামটি প্রাইমারি কি হতে পারে তা চিহ্নিত করতে পারলে সেটি আলাদাভাবে উল্লেখ করে দিতে হয়। আবার কোনো কোনো সময় প্রাইমারি কি চিহ্নিত করা সম্ভব নাও হতে পারে। তখন শুরুতে একটি কলাম যোগ করা হয়। এটি একটি সংখ্যার কলাম হবে এবং প্রতিটি রেকর্ড বা রো- এর জন্য আলাদা হবে। সাধারণত, টেবিলে id নামের একটি কলাম যোগ করা হয়, যেটি ইন্টিজার টাইপের ডেটা ধারণ করে এবং এর সঙ্গে অটো ইনক্রিমেন্ট (Auto Increment) বৈশিষ্ট্য জুড়ে দেওয়া হয়, যেন প্রতিটি রো ইনসার্ট (insert) করার সময় এর মান এক-এক করে বাড়ে (এই কলামের জন্য তাই কোনো মান নিজে থেকে দিতে হয় না, ডেটাবেজ সিস্টেম নিজেই এটি নিয়ন্ত্রণ করে)।
রিলেশনাল ডেটাবেজে সব টেবিলেই প্রাইমারি কি থাকতে হয়। যদিও প্রাইমারি কি ছাড়াও টেবিল তৈরি করাযায়। সেক্ষেত্রে অনেক সময় ডেটাবেজ নিজেই একটি প্রাইমারি কি তৈরি করে নেয়।
শিক্ষার্থী টেবিলে শ্রেণি, শাখা ও রোল— এই তিনটি কলাম মিলে প্রাইমারি কি তৈরি করা যায়। তবে এখানে একটি সমস্যা হতে পারে। এভাবে টেবিল তৈরি করলে আমরা কেবল বর্তমান শিক্ষার্থীদের তথ্যই রাখতে পারব। অতীতের শিক্ষার্থীদের তথ্য রাখা সম্ভব হবে না, যেমন— পাঁচ বছর আগের কোনো শিক্ষার্থী, যে পড়ত সপ্তম শ্রেণির দিবা শাখার এবং যার রোল নম্বর ছিল দুই, তাকে আলাদাভাবে বের করা যাবে না। তাই আমরা নতুন একটি কলামে প্রতিটি শিক্ষার্থীর জন্য পৃথক একটি আইডি দিতে পারি। আবার কোনো কোনো প্রতিষ্ঠানে রোল নম্বর এমনভাবে তৈরি করা হয়, যেন রোল নম্বর দেখলেই বোঝা যায় যে, সে কোন বছরের কোন ক্লাসের কোন শাখার কত নম্বর শিক্ষার্থী। আবার অনেক প্রতিষ্ঠানে একে রেজিস্ট্রেশন নম্বরও বলা হয়, যা একজন শিক্ষার্থীর জন্য সবসময় একই থাকে। ওপরের ক্লাসে উঠলে রোল নম্বর পরিবর্তন হবে, কিন্তু রেজিস্ট্রেশন নম্বর পরিবর্তন হবে না।
বাংলাদেশে প্রতিটি প্রাপ্তবয়স্ক মানুষেরই একটি করে জাতীয় পরিচয়পত্র আছে (যাকে ন্যাশনাল আইডি কার্ড- National ID Card-ও বলা হয়)। সেখানে কিন্তু প্রতিটি মানুষকে আলাদা নম্বর দিয়ে চিহ্নিত করা হয়, এবং কখনোই দুজন মানুষের নম্বর একরকম হতে পারবে না।
গণপ্রজাতন্ত্রী বাংলাদেশ সরকার
Government of the People's Republic of Bangladesh
NATIONAL ID CARD / জাতীয় পরিচয় পত্র
নামঃ
Name
পিতাঃ
মাতাঃ
Signature
Date of Birth:
ID NO:
চিত্র 6.1: বাংলাদেশের জাতীয় পরিচয়পত্র
ভাই বিভিন্ন টেবিলে যদি প্রাপ্তবয়স্ক মানুষের তথ্য রাখা হয়, সেসব জায়গায় জাতীয় পরিচয়পত্রের নম্বর প্রাইমারি কি হিসেবে ব্যবহার করা যেতে পারে।
ডেটাবেজ রিলেশন বলতে আসলে ডেটাবেজের টেবিলগুলোর মধ্যে সম্পর্ক বোঝানো হয়। একটি ডেটাবেজে এক বা একাধিক টেবিল থাকতে পারে। যখন একাধিক টেবিল থাকে, তখন প্রায়শই টেবিলগুলোর মধ্যে সম্পর্ক বা রিলেশন (relation) থাকে। এই রিলেশন আবার তিন ধরনের হতে পারে :
ডেটাবেজ ম্যানেজমেন্ট সিস্টেম
১. ওয়ান টু ওয়ান (one to one)
২. ওয়ান টু মেনি (one to many)
৩. মেনি টু মেনি (many to many)
১. ওয়ান টু ওয়ান রিলেশন
দুটি টেবিলের মধ্যে যদি ওয়ান টু ওয়ান রিলেশন থাকে, তবে একটি টেবিলের একটি রো-এর সঙ্গে অন্য টেবিলের একটিমাত্র রো-এর সম্পর্ক খুঁজে পাওয়া যাবে। ধরা যাক, শিক্ষার্থীদের সাধারণ তথ্য রাখার জন্য একটি টেবিল student_info তৈরি হলো। আবার শিক্ষার্থীদের যোগাযোগের ঠিকানা রাখার জন্য তৈরি করা হলো student_contact টেবিল। টেবিলগুলো নিম্নরূপ :
উপরের টেবিল দুটির মধ্যে ওয়ান টু ওয়ান রিলেশন বিদ্যমান। যেমন – student_info টেবিলের প্রতিটি রো-তে একজন শিক্ষার্থীর তথ্য রয়েছে। এই টেবিলের প্রাইমারি কি হচ্ছে Roll (যদিও প্রাইমারি কি হিসেবে Roll সবসময় সঠিক নয়, তবে এখানে আলোচনার সুবিধার্থে এটি প্রাইমারি কি হিসেবে ঘোষণা করা হয়েছে)। এখন, এই টেবিলে প্রতিটি শিক্ষার্থী (রো)-এর জন্য student_contact টেবিলে একটি রো থাকবে, যেখানে ওই শিক্ষার্থীর যোগাযোগের ঠিকানা (ফোন, ইমেইল, বাসার ঠিকানা) থাকবে। student_info টেবিলে Roll হচ্ছে প্রাইমারি কি, কিন্তু student_contact টেবিলে Roll হচ্ছে ফরেন কি (foreign key)। একটি টেবিলের প্রাইমারি কি অন্য টেবিলে যখন ব্যবহার করা হয়, তখন সেই টেবিলে সেই কি-কে ফরেন কি বলা হয়। এই বিশেষ কি দিয়ে টেবিলদুটি সম্পর্কযুক্ত হয়।
২. ওয়ান টু মেনি রিলেশন
ধরা যাক, শিক্ষার্থীদের পরীক্ষার ফল সংরক্ষণ করার জন্য result নামের একটি টেবিল তৈরি করা হলো। টেবিলের প্রতিটি রো-তে একজন শিক্ষার্থীর একটি বিষয়ে পরীক্ষায় প্রাপ্ত নম্বর থাকবে।
টেবিলের নাম : result
Roll
Subject
(Integer, Primary Key)
1
2
(Integer )
1
1
2
2
ID
(Text)
Bangla
English
Marks (Decimal)
70
76
3
4
Bangla
English
68
81
এখানে দেখা যাচ্ছে যে, student_info টেবিলের একটি রো-এর সঙ্গে result টেবিলের একাধিক রো-এর সম্পর্ক রয়েছে। যেমন- রোল নম্বর 1 যার, তার দুটি বিষয়ে প্রাপ্ত নম্বর result টেবিলে দুটি রো-তে রাখা আছে। student_info ও result টেবিলের মধ্যকার সম্পর্ককে ওয়ান টু মেনি রিলেশন বলা হয়, কারণ প্রথম টেবিলের একটি রো-এর সঙ্গে দ্বিতীয় টেবিলের একাধিক রো-এর সম্পর্ক রয়েছে। result টেবিলের
Roll হচ্ছে ফরেন কি ।
৩. মেনি টু মেনি
যখন দুটি টেবিল এমনভাবে সম্পর্কযুক্ত হয় যে, প্রথম টেবিলের একটি রো, দ্বিতীয় টেবিলের একাধিক রো- এর সঙ্গে সম্পর্কযুক্ত, আবার দ্বিতীয় টেবিলের একটি রো, প্রথম টেবিলের একাধিক রো-এর সঙ্গে সম্পর্কযুক্ত হয়, তখন তাদের মধ্যকার সম্পর্ককে বলা হয় মেনি টু মেনি রিলেশনশিপ।
ধরা যাক, স্কুলে বিভিন্ন ক্লাব তৈরি করা হয়েছে। যেমন— ফুটবল ক্লাব, ক্রিকেট ক্লাব, দাবা ক্লাব, বিতর্ক ক্লাব, বিজ্ঞান ক্লাব, সাংস্কৃতিক ক্লাব ইত্যাদি। একজন শিক্ষার্থী এক বা একাধিক ক্লাবের সদস্য হতে পারে। আবার একটি ক্লাবে একাধিক শিক্ষার্থী থাকতে পারে। নিচে club টেবিলটি দেওয়া হলো-
এই টেবিলের প্রাইমারি কি হচ্ছে Name. অর্থাৎ প্রতিটি ক্লাবের অনন্য (unique) নাম থাকবে, একই নামে একাধিক ক্লাব থাকতে পারবে না।
এখন student_info ও club টেবিল দুটির মধ্যে সম্পর্ক স্থাপনের জন্য আমাদেরকে আরেকটি টেবিল তৈরি করতে হবে।
টেবিলের নাম : student_club
Roll
(Integer )
1
Cricket Club
Cricket Club
club_name (text)
Football Club
Chess Club
Debating Club
মেনি টু মেনি রিলেশনের জন্য এরকম একটি টেবিল তৈরি করতে হয়, যার কাজ হচ্ছে মূল টেবিলদুটি যুক্ত করা।
রিলেশনাল ডেটাবেজে এসকিউএল (SQL : Structured Query Language) নামক প্রোগ্রামিং ভাষার সাহায্যে ডেটাবেজে তথ্য লেখা, পড়া, পরিবর্তন করা ও অন্যান্য কাজ করা হয়। এসকিউএল ভাষার নির্ধারিত নিয়ম-কানুন থাকলেও বিভিন্ন বাণিজ্যিক ডেটাবেজ তাদের নিজস্ব কুয়েরি ভাষা ব্যবহার করে, যা প্রমিত (standard) এসকিউএল-এর বেশ কাছাকাছি।
এসকিউএল-এর সঙ্গে সাধারণ প্রোগ্রামিং ভাষাগুলোর মূল পার্থক্য কোথায়? একজন প্রোগ্রামার যখন একটি নির্দিষ্ট সমস্যা সমাধানের জন্য প্রোগ্রাম লিখেন, তখন আসলে সেই সমস্যাটি সমাধানের যে অ্যালগরিদম, সেটিকেই প্রোগ্রামিং ভাষার মাধ্যমে প্রকাশ করেন। এসব প্রোগ্রামে কম্পিউটারের জন্য সুনির্দিষ্টভাবে বলা থাকে যে, কীভাবে ও কোন ধাপে কী কাজ করা হবে। কম্পিউটার শুধু সেই নির্দেশনা অনুসরণ করে। আর এসকিউএল কুয়েরি লেখার সময় বলে দিতে হয় যে, ডেটাবেজ সিস্টেমের কাছ থেকে কোন তথ্য চাওয়া হচ্ছে বা কোন তথ্য রাখতে হবে। অর্থাৎ কী করতে হবে সেটি বলে দিতে হয়। আর সেই কাজটি কীভাবে করা হবে, সেটি নির্ভর করে ডেটাবেজ সিস্টেমের উপর। এ জন্য এসকিউএল-কে বলা হয় ডিক্লারেটিভ (declarative) প্রোগ্রামিং ভাষা। সি এবং সি-এর মতো অন্যান্য প্রোগ্রামিং ভাষাকে বলা হয় প্রসিডিউরাল (procedural) প্রোগ্রামিং ভাষা। এসকিউএল ভাষাটি এমনভাবে তৈরি করা হয়েছে যেন, কেবল প্রোগ্রামাররাই নন, যারা প্রোগ্রামিং জগতের বাইরের মানুষ, তারাও যেন সহজে এটি শিখে ব্যবহার করতে পারেন।
এসকিউএলকে আবার কয়েক ভাগে ভাগ করা যায়। এর মধ্যে গুরুত্বপূর্ণ দুটি হচ্ছে : ডেটা ডেফিনেশন ল্যাঙ্গুয়েজ (Data Definition Language বা সংক্ষেপে DDL) ও ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ (Data Manipulation Language বা সংক্ষেপে DML)।
ডেটা ডেফিনেশন ল্যাঙ্গুয়েজ
ডেটাবেজের টেবিল তৈরি করা, টেবিল মুছে ফেলা, ইনডেক্স তৈরি করা ইত্যাদি কাজ করার জন্য ডেটা ডেফিনেশন ল্যাঙ্গুয়েজ ব্যবহার করা হয়। যেমন— একটি টেবিল তৈরি করতে গেলে টেবিলের নাম, টেবিলের বিভিন্ন কলামের নাম ও সেখানে কী ধরনের ডেটা থাকবে, ইনডেক্স ইত্যাদি বলে দিতে হয়।
ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজ
ডেটা ম্যানিপুলেশন ল্যাঙ্গুয়েজের সাহায্যে একটি টেবিলের ডেটার উপর বিভিন্ন ধরনের কুয়েরি চালানো হয়, যেমন— ডেটা পড়া, ডেটা পরিবর্তন করা, ডেটা মুছে ফেলা ইত্যাদি।